package cn.tedu.cqhotel.service.impl;

import cn.tedu.cqhotel.ex.ServiceCode;
import cn.tedu.cqhotel.ex.ServiceException;
import cn.tedu.cqhotel.mapper.StaffMapper;
import cn.tedu.cqhotel.pojo.dto.StaffAddNewDTO;
import cn.tedu.cqhotel.pojo.dto.StaffUpdateDTO;
import cn.tedu.cqhotel.pojo.entity.Staff;
import cn.tedu.cqhotel.pojo.vo.StaffListItemVO;
import cn.tedu.cqhotel.pojo.vo.StaffStandardVO;
import cn.tedu.cqhotel.service.IStaffService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;

/**
 * 处理品牌业务的实现类
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Slf4j
@Service
public class StaffServiceImpl implements IStaffService {

    @Autowired
    private StaffMapper staffMapper;


    public StaffServiceImpl() {
        log.info("创建业务对象：StaffServiceImpl");
    }

    @Override
    public void addNew(StaffAddNewDTO staffAddNewDTO) {
        log.debug("开始处理【添加员工】的业务，参数：{}", staffAddNewDTO);

        // 调用Mapper对象的【根据身份证号统计数量】方法进行统计
        String idCard = staffAddNewDTO.getIdCard();
        int count = staffMapper.countByIdCard(idCard);
        log.trace("根据名称【{}】统计数量：{}", idCard, count);
        // 判断统计结果是否大于0
        if (count > 0) {
            // 是：名称已经被占用，抛出异常（CONFLICT）
            String message = "添加员工失败，尝试添加的身份证号【" + idCard + "】已经存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        log.trace("身份证号没有被占用，继续向后执行……");

        // 创建品牌对象，用于插入到数据表
        Staff staff = new Staff();
        BeanUtils.copyProperties(staffAddNewDTO, staff);

        // 插入数据
        log.debug("即将向数据库中插入数据：{}", staff);
        int rows = staffMapper.insert(staff);
        if (rows != 1) {
            String message = "添加员工失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void deleteById(Long id) {
        log.debug("开始处理【删除员工】的业务，参数：{}", id);
        // 调用Mapper对象的getDetailsById()方法执行查询
        StaffStandardVO queryResult = staffMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "删除员工信息失败，尝试删除的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 调用Mapper对象的deleteById()执行删除，并获取返回值
        int rows = staffMapper.deleteById(id);
        // 判断以上返回值是否不为1
        if (rows != 1) {
            // 是：抛出异常(ERR_DELETE)
            String message = "删除员工信息失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }

    @Override
    public void updateById(Long id, StaffUpdateDTO staffUpdateDTO) {
        log.debug("开始处理【修改员工信息】的业务，参数：{}", id);
        // 调用Mapper对象的getDetailsById()方法执行查询
        StaffStandardVO queryResult = staffMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "修改员工信息失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        Staff staff = new Staff();
        BeanUtils.copyProperties(staffUpdateDTO, staff);
        staff.setId(id);

        // 修改数据
        log.debug("即将修改数据：{}", staff);
        int rows = staffMapper.updateById(staff);
        if (rows != 1) {
            String message = "修改员工信息失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public void setEnable(Long id) {
        log.debug("开始处理【启用员工】的业务，参数：{}", id);
        // 调用Mapper对象的getDetailsById()方法执行查询
        StaffStandardVO queryResult = staffMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "启用员工失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 判断查询结果中的isEnable是否为1
        if (queryResult.getIsEnable() == 1) {
            // 是：此id对应的品牌已经是启用状态，则抛出异常(ERR_CONFLICT)
            String message = "启用员工失败，当前员工已经处于启用状态！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 创建Staff对象（作为修改数据的方法的参数）
        Staff staff = new Staff();
        // 向Staff对象中封装id（参数id）与isEnable（固定为1）属性的值
        staff.setId(id);
        staff.setIsEnable(1);
        // 调用Mapper对象的updateById()修改品牌数据，并获取返回值
        int rows = staffMapper.updateById(staff);
        // 判断以上返回值是否不为1
        if (rows != 1) {
            // 是：抛出异常(ERR_UPDATE)
            String message = "启用员工失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public void setDisable(Long id) {
        log.debug("开始处理【禁用员工】的业务，参数：{}", id);
        // 调用Mapper对象的getDetailsById()方法执行查询
        StaffStandardVO queryResult = staffMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "禁用员工失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 判断查询结果中的enable是否为0
        if (queryResult.getIsEnable() == 0) {
            // 是：此id对应的品牌已经是禁用状态，则抛出异常(ERR_CONFLICT)
            String message = "禁用员工失败，当前员工已经处于禁用状态！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 创建Staff对象（作为修改数据的方法的参数）
        Staff staff = new Staff();
        // 向Staff对象中封装id（参数id）与enable（固定为0）属性的值
        staff.setId(id);
        staff.setIsEnable(0);
        // 调用Mapper对象的updateById()修改品牌数据，并获取返回值
        int rows = staffMapper.updateById(staff);
        // 判断以上返回值是否不为1
        if (rows != 1) {
            // 是：抛出异常(ERR_UPDATE)
            String message = "禁用员工失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public StaffStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询员工信息】的业务");
        StaffStandardVO staff = staffMapper.getStandardById(id);
        if (staff == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "获取员工信息失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return staff;
    }

    @Override
    public List<StaffListItemVO> listByName(String name) {
        log.debug("开始处理【根据name查询员工信息】的业务");
        return staffMapper.listByName(name);
    }

    @Override
    public List<StaffListItemVO> list() {
        log.debug("开始处理【查询员工信息列表】的业务");
        return staffMapper.list();
    }
}
